import unittest
from HTMLTestRunner import HTMLTestRunner
from Py39.calcl_demo import calTest
# from Py39 import cal_Test


class calc_Test(unittest.TestCase):
    def setUp(self):
        print('test start...')
    def tearDown(self):
        print('test end....')
    @classmethod
    def setUpClass(cls):
        print('test begin..')
    @classmethod
    def tearDownClass(cls):
        print('test over...')

    def test_add01(self):#测试用例一：校验加法：1+2？=3
        cal =calTest()
        self.assertEqual(3,cal.add(1,2),msg='test01 falied')
        print('test01 pass')
    # @unittest.skip#强制跳过
    # @unittest.skipIf(1<2,reason='1<2,跳过')
    # @unittest.skipUnless(2<1,reason='1<2,跳过')
    def test_add02(self):#测试用例二：校验加法：1.0+2.5？=3。5
        cal =calTest()
        self.assertEqual(cal.add(1.0,2.5),3.5,msg='1.0+2!=3.5')
        print('test02 pass')

class assert_Test(unittest.TestCase):
    def test_assert02(self):#断言的方法二,若断言预期结果与实际结果谁大谁小
        # self.assertGreater(1,2,msg='1<2')
        a=1
        b=2
        self.assertGreater(a,b,msg='测试失败')#断言a>b?

        self.assertLess(a,b,msg='1>2')#断言a<b?

    def test_assert03(self):
        a=calTest()
        # b=calTest()

        self.assertIsInstance(a,calTest,msg='not Instance')
        self.assertIsInstance(a, calc_Test, msg='not Instance')
        print('test assert')



if __name__ == '__main__':
    unittest.main()#运行所有的测试用例

#####TestResult#####
    suite=unittest.TestSuite()#实例化测试集
    suite.addTest(calc_Test('test_add01'))#加载单个测试用例到测试集中
    suite.addTests((calc_Test('test_add02'),assert_Test('test_assert03')))#加载多个测试用例
    r=unittest.TestResult()#实例化一个测试结果用于存储测试结果
    suite.run(result=r)#以测试集方式执行测试

    print(r.testsRun)#测试用例的执行数量
    print(r.__dict__)#以字典方式输出测试结果
    print(r.failures)#输出测试失败的记录

#####TextTestRunner#####
    #测试集实例化
    suite=unittest.TestSuite()
    #加载测试用例进入测试集
    suite.addTest(calc_Test('test_add01'))
    #执行测试集
    unittest.TextTestRunner(verbosity=2).run(suite)#--第一种方式
    runner=unittest.TextTestRunner()#实例化一个runner对象，第二方式
    runner.run(suite)#执行测试集

#####TestLoader#####
    suite=unittest.TestSuite()#实例化测试集
    # 加载测试用例至测试集中
    suite.addTests(unittest.TestLoader().loadTestsFromTestCase(calc_Test))
    suite.addTests(unittest.TestLoader().loadTestsFromName('cal_Test.calc_Test.test_add01'))#指定某个模块下的某个类下的方法/用例
    suite.addTests(unittest.TestLoader().loadTestsFromName('cal_Test.calc_Test'))#指定某个类名进行加载用例
    suite.addTests(unittest.TestLoader().loadTestsFromModule(cal_Test))#加载整个模块进入测试集
    runner=unittest.TextTestRunner(verbosity=2)#实例化runner对象
    runner.run(suite)#执行测试集

###生成系统自带的测试报告
    with open('report.txt','w') as file:
        unittest.TextTestRunner(stream=file,verbosity=2).run(suite)

###生成HTML测试报告
    with open('report.html','w',encoding='utf-8') as file:
        HTMLTestRunner(stream=file,verbosity=2,title='测试报告',description='计算器的测试报告').run(suite)
















